package bch.netty.handler;

import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j;

/**
 * @author DCJ
 * 全局异常处理器
 */
@Slf4j
public class GlobalExceptionHandler extends ChannelDuplexHandler {

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        sendErrorMessage(ctx, cause.getMessage());
    }

    private void sendErrorMessage(ChannelHandlerContext ctx, String errorMessage) {
        TextWebSocketFrame errorFrame = new TextWebSocketFrame(errorMessage);
        // 如果outbound中异常再fire 异常，则会stackOverFlow
        // 第一个context(head)处理异常 就不会经过有异常的outboundHandler了
        ctx.pipeline().firstContext().writeAndFlush(errorFrame).addListener(future -> {
            if (future.isSuccess()) {
                log.error("错误消息发送成功：{}", errorMessage);
            } else {
                log.error("错误消息发送失败：{}", errorMessage);
            }
            ctx.close();
        });
    }
}
